/**
 * @file TaskStat.h
 * @author rj.wang (rj.wang@aotbot.com)
 * @brief 清洁任务数据统计相关
 * @version 0.1
 * @date 2024-11-08
 * @copyright Copyright (c) 2024
 */

#ifndef __STATISTICS_TASK_STAT_H_
#define __STATISTICS_TASK_STAT_H_

#include "Pose2D.h"
#include "GridMapCV.h"
#include "glog_func/log.h"

namespace common {
namespace statistics{

struct TaskStat {
  enum BoundaryType { // 任务外框类型
    NO_BOUND = 0,     // 没有外框 (示教/贴边等)
    DRAW_BOUND = 1,   // 手绘外框
    TEACH_BOUND = 2,  // 示教外框 (需要外扩半个清洁宽度获取实际的外框)
  };

  uint8_t bound_type{NO_BOUND};                   // 任务外框类型
  PoseVec boundary{};                             // 任务外框
  std::vector<PoseVec> clean_paths{};             // 任务路径
  double clean_width;                             // 清扫宽度
  common::planning::GridMapCV<uchar> cv_map;      // 用于标记任务路径对应的清洁范围 (非0像素)

  /**
   * @brief 数据初始化
   * @param bound_type 任务外框类型
   * @param boundary 任务外框（世界坐标系）
   * @param clean_paths 任务路径（世界坐标系）
   * @param clean_width 清扫宽度, unit: m
   * @param origin 栅格地图左下角栅格的左下角点对应的世界坐标
   * @param resolution 栅格地图分辨率, unit: m
   * @param width 栅格地图的宽, unit: 栅格
   * @param height 栅格地图的高, unit: 栅格
   */
  void Init(const uint8_t bound_type,
            const PoseVec& boundary,
            const std::vector<PoseVec>& clean_paths,
            const double clean_width,
            const Pose& origin,
            const double resolution,
            const int64_t width,
            const int64_t height);

  /**
   * @brief 根据任务外框、任务路径、清扫宽度计算待清洁的栅格, 保存至cv_map的非0栅格中
   * @param morph_close 是否对待清洁区做形态学闭操作 (去除狭小黑色区域)
   * @param close_kenel_size 形态学闭操作核的尺寸
   */
  void CalcGridsToClean(const bool morph_close, const int close_kenel_size);

};

} //end of namespace statistics
} //end of namespace common
#endif